/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.criar;

import br.com.foxinline.enums.TipoDocumento;
import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.AnexoServico;
import br.com.foxinline.servico.FolhaPagamentoServico;
import br.com.foxinline.servico.PessoaServico;
import br.com.foxinline.servico.SecretariaServico;
import br.com.foxinline.util.Msg;
import br.com.foxinline.utilitarios.ArquivoUtilitario;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.Serializable;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerCriarFolhaPagamento implements Serializable {

    @EJB
    PessoaServico pessoaServico;
    @EJB
    FolhaPagamentoServico folhaPagamentoServico;
    @EJB
    AnexoServico anexoServico;
    @EJB
    SecretariaServico secretariaServico;
    private Pessoa funcionario;
    private Secretaria secretaria;
    private List<Secretaria> secretarias;
    private Secretaria secretariaPesquisar;
    private FolhaPagamento folhaPagamento;
    private ItemFolhaPagamento itemFolhaPagamento;
    private List<ItemFolhaPagamento> itensFolhaPagamento;
    private ArquivoUtilitario arquivoUtilitario = new ArquivoUtilitario();
    private List<FolhaPagamento> folhasPagamentos;
    private static final String msgFailure = ":: Erro de validação: o valor é necessário.";

    @PostConstruct
    public void init() {
        folhaPagamento = new FolhaPagamento();
        folhaPagamento.setAnexos(new ArrayList<Anexo>());

        itemFolhaPagamento = new ItemFolhaPagamento();
        secretaria = new Secretaria();
        iniciarDialogSecretaria();
        iniciarFuncionario();
        itensFolhaPagamento = new ArrayList<ItemFolhaPagamento>();
        folhasPagamentos = folhaPagamentoServico.findLimit(null);
    }

    public void salvar() {
        try {
            folhaPagamento.setItensFolhaPagamento(itensFolhaPagamento);

            if (secretaria != null && secretaria.getId() != null) {
                folhaPagamento.setSecretaria(secretaria);

                if (!folhaPagamento.getItensFolhaPagamento().isEmpty()) {

                    if (!folhaPagamento.getAnexos().isEmpty()) {
                        arquivoUtilitario.gravarAnexos(folhaPagamento.getAnexos());
                        folhaPagamento.setAnexos(arquivoUtilitario.removerBytes(folhaPagamento.getAnexos()));
                    }

                    folhaPagamento.setItensFolhaPagamento(itensFolhaPagamento);
                    folhaPagamentoServico.salvar(folhaPagamento);
                    Msg.messagemInfo(Msg.SuccessFull);
                    init();
                } else {
                    Msg.messagemError("Informe pelo menos um item para a Folha de Pagamento !");
                }
            } else {
                Msg.messagemError("Secretaria" + msgFailure);
                RequestContext.getCurrentInstance().execute("requiredSecretaria(true)");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Msg.messagemError(Msg.Failure);
        }
    }

    public void existeCliente() {
        Pessoa p = pessoaServico.existProprietario(funcionario);

        if (p != null) {
            funcionario = p;
        } else {
            funcionario.setId(null);
        }
    }

    public List<SelectItem> getTipoDocumento() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoDocumento tipo : TipoDocumento.values()) {
            items.add(new SelectItem(tipo, tipo.getNome()));
        }
        return items;
    }

    public String dataNascimento() {
        if (funcionario.getDataNascimento() != null) {
            return new SimpleDateFormat("dd/MM/yyyy").format(funcionario.getDataNascimento());
        }
        return null;
    }
    private static int tamanhoMaximoNome = 10;

    public String nomeAnexo(Anexo a) {
        if (a.getNomeExibicao().length() >= tamanhoMaximoNome) {
            return a.getNomeExibicao().substring(0, tamanhoMaximoNome).concat("...");
        }
        return a.getNomeExibicao().replace(".png", "").replace(" ", "_");
    }

    public String nomeAnexoPdf(Anexo a) {
        if (a.getNomeExibicao().length() >= tamanhoMaximoNome) {
            return a.getNomeExibicao().substring(0, tamanhoMaximoNome).concat("...");
        }
        return a.getNomeExibicao().replace(".pdf", "").replace(" ", "_");
    }

    public void handleAnnex(FileUploadEvent event) throws IOException {
        try {
            folhaPagamento.getAnexos().add(arquivoUtilitario.adicionarArquivo(event));
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ManagerCriarFolhaPagamento.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ManagerCriarFolhaPagamento.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Remove o anexo da lista de anexos do processo que está sendo adicionado e
     * remove o arquivo do diretório que foi gravado
     *
     * @param anexo
     */
    public void removerAnexo(Anexo anexo) {
        try {
            arquivoUtilitario.excluirArquivo(new File(anexo.getUrl() + anexo.getNome()));
            folhaPagamento.getAnexos().remove(anexo);
        } catch (Exception e) {
            Msg.messagemError(Msg.Failure);
        }
    }

    public void adicionarItemFolhaPagamento() {
        if (funcionarioValido()) {
            itemFolhaPagamento.setPessoa(funcionario);

            if (!itensFolhaPagamento.contains(itemFolhaPagamento)) {
                itensFolhaPagamento.add(itemFolhaPagamento);
            }

            iniciarFuncionario();
            itemFolhaPagamento = new ItemFolhaPagamento();
        } else {
            RequestContext.getCurrentInstance().execute("requiredFuncionario(true)");
        }
    }

    public void editarItemFolhaPagamento(ItemFolhaPagamento itemFolhaPagamento) {
        this.itemFolhaPagamento = itemFolhaPagamento;
        funcionario = itemFolhaPagamento.getPessoa();
        itensFolhaPagamento.remove(itemFolhaPagamento);
    }

    public void removerItemFolhaPagamento(ItemFolhaPagamento item) {
        itensFolhaPagamento.remove(item);
    }

    private boolean funcionarioValido() {
        if (isPessoaFisica()) {
            if (funcionario.getCpf() == null || funcionario.getCpf().equals("")) {
                Msg.messagemError("CPF".concat(msgFailure));
            }
            if (funcionario.getNome() == null || funcionario.getNome().equals("")) {
                Msg.messagemError("Nome".concat(msgFailure));
            }
            if ((funcionario.getCpf() == null || funcionario.getCpf().equals("")) || (funcionario.getNome() == null || funcionario.getNome().equals(""))) {
                return false;
            }
        } else {
            if (funcionario.getCnpj() == null || funcionario.getCnpj().equals("")) {
                Msg.messagemError("CNPJ".concat(msgFailure));
            }
            if (funcionario.getNomeFantasia() == null || funcionario.getNomeFantasia().equals("")) {
                Msg.messagemError("Nome Fantasia".concat(msgFailure));
            }
            if ((funcionario.getCnpj() == null || funcionario.getCnpj().equals("")) || (funcionario.getNomeFantasia() == null || funcionario.getNomeFantasia().equals(""))) {
                return false;
            }
        }
        return true;
    }

    public void pesquisarSecretaria() {
        secretarias = secretariaServico.pesquisarSecretaria(secretariaPesquisar);
    }

    public void setarSecretaria(Secretaria secretaria) {
        this.secretaria = secretaria;
        iniciarDialogSecretaria();
    }

    public void removerSecretaria() {
        this.secretaria = new Secretaria();
    }

    public void iniciarFuncionario() {
        funcionario = new Pessoa();
        funcionario.setTipoDocumento(TipoDocumento.CPF);
    }

    public boolean isPessoaFisica() {
        return funcionario.getTipoDocumento().equals(TipoDocumento.CPF);
    }

    /**
     * Inicia os fields utilizados no dialog para pesquisar e atribuir a
     * secretaria
     */
    public void iniciarDialogSecretaria() {
        secretariaPesquisar = new Secretaria();
        secretarias = new ArrayList<Secretaria>();
    }

    public FolhaPagamento getFolhaPagamento() {
        return folhaPagamento;
    }

    public void setFolhaPagamento(FolhaPagamento folhaPagamento) {
        this.folhaPagamento = folhaPagamento;
    }

    public Pessoa getFuncionario() {
        return funcionario;
    }

    public void setFuncionario(Pessoa funcionario) {
        this.funcionario = funcionario;
    }

    public ItemFolhaPagamento getItemFolhaPagamento() {
        return itemFolhaPagamento;
    }

    public void setItemFolhaPagamento(ItemFolhaPagamento itemFolhaPagamento) {
        this.itemFolhaPagamento = itemFolhaPagamento;
    }

    public List<ItemFolhaPagamento> getItensFolhaPagamento() {
        return itensFolhaPagamento;
    }

    public void setItensFolhaPagamento(List<ItemFolhaPagamento> itensFolhaPagamento) {
        this.itensFolhaPagamento = itensFolhaPagamento;
    }

    public Secretaria getSecretaria() {
        return secretaria;
    }

    public void setSecretaria(Secretaria secretaria) {
        this.secretaria = secretaria;
    }

    public Secretaria getSecretariaPesquisar() {
        return secretariaPesquisar;
    }

    public void setSecretariaPesquisar(Secretaria secretariaPesquisar) {
        this.secretariaPesquisar = secretariaPesquisar;
    }

    public List<Secretaria> getSecretarias() {
        return secretarias;
    }

    public void setSecretarias(List<Secretaria> secretarias) {
        this.secretarias = secretarias;
    }

    public List<FolhaPagamento> getFolhasPagamentos() {
        return folhasPagamentos;
    }

    public void setFolhasPagamentos(List<FolhaPagamento> folhasPagamentos) {
        this.folhasPagamentos = folhasPagamentos;
    }
}
